package org.java.base.randAccessFile;


import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class RandAccessFileDemo {
    public static void main(String[] args) throws IOException {
        RandAccessFileDemo ce = new RandAccessFileDemo();
//        ce.fileChannelExample();
        //  ce.channelExample();
        ce.channelExample();
    }

    public void mapChannel() throws IOException {
        int length = 100;
        // 为了以可读可写的方式打开文件，这里使用RandomAccessFile来创建文件。
        FileChannel fc = new RandomAccessFile("test.dat", "rw").getChannel();
        //注意，文件通道的可读可写要建立在文件流本身可读写的基础之上
        MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, length);
        //写128M的内容
        for (int i = 0; i < length; i++) {
            out.put((byte) 'x');
        }
        System.out.println("Finished writing");
        //读取文件中间6个字节内容
        for (int i = length / 2; i < length / 2 + 6; i++) {
            System.out.print((char) out.get(i));
        }
        fc.close();


    }

    /**
     * RandomAccessFile 的强大之处：
     * 有权限 ，可以指定是只读还是读写（r,rw）
     * 定位和搜寻方法：seek( )
     * RandomAccessFile的工作方式是，把DataInputStream和DataOutputStream结合起来，再加上它自己的一些方法，
     * 比如定位用的getFilePointer( )，在文件里移动用的seek( )，
     * 以及判断文件大小的length( )、skipBytes()跳过多少字节数
     * <p>
     * 还可以获取channel
     */
    public void channelExample() {
        try {
            RandomAccessFile aFile = new RandomAccessFile("D:\\个人文件\\学习\\data\\nio\\nio-data.txt", "rw");
            FileChannel fileChannel = aFile.getChannel();
            ByteBuffer buf = ByteBuffer.allocate(48);

            int bytesRead = fileChannel.read(buf);
            while (bytesRead != -1) {

                System.out.println("Read " + bytesRead);
                buf.flip();

                while (buf.hasRemaining()) {
                    System.out.print((char) buf.get());
                }

                buf.clear();
                bytesRead = fileChannel.read(buf);
            }
            aFile.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }


}
